home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / programmierung / alienbreed3d2_src / cheesesauce / somethingstrange2.s < prev    next >
Text File  |  1997-01-31  |  21KB  |  834 lines

  1.  
  2. ;        opt o+,l+,d+
  3.  
  4.         incdir    utils:sysinc/
  5.  
  6.         include    "exec/execbase.i"
  7.         include "exec/exec.i"
  8.         include    "graphics/graphics_lib.i"
  9.         include "hardware/custom.i"
  10.  
  11.         xdef    _c2p8_init
  12.         xdef    _c2p8_go
  13.  
  14. ; ---------------------------------------------------------------------
  15.  
  16. ; void __asm c2p8_init (register __a0 UBYTE *chunky,
  17. ;            register __a1 UBYTE *chunky_cmp,
  18. ;            register __a2 PLANEPTR *planes,
  19. ;            register __d0 ULONG signals1,
  20. ;            register __d1 ULONG signals2,
  21. ;            register __d2 ULONG pixels,     // width*height
  22. ;            register __d3 ULONG offset,     // byte offset into plane
  23. ;            register __d4 UBYTE *buff2,    // Chip buffer width*height
  24. ;            register __d5 UBYTE *buff3,    // Chip buffer width*height
  25. ;            register __a3 struct GfxBase *GfxBase);
  26. ;
  27. ; void c2p8_go();
  28. ;
  29. ; -------------------------------------------------------------------
  30. ;
  31. ; Pipelined CPU+blitter 8-plane chunky to planar converter.
  32. ; Optimised for 68020/30 with fastmem.
  33. ;
  34. ; Author: Peter McGavin (e-mail peterm@maths.grace.cri.nz), 21 April 1994
  35. ; Based on James McCoull's 4-pass blitter algorithm.
  36. ;
  37. ; Modified by Conrad Sanderson (g.sanderson@ais.gu.edu.au), 4 June 1994
  38. ;
  39. ; This code is public domain.
  40. ;
  41. ; algorithm:
  42. ;
  43. ; Uses chunky comparison buffer.  Returns immediately if no diffs found.
  44. ; Performs first 2 passes (Fast->Chip) with the CPU (in 1 pass).
  45. ; Only converts 32-pixel "units" that changed since last time.
  46. ; Updates chunky comparison buffer.
  47. ; If nothing has changed, signals signals1 and return immediately.
  48. ; Waits for previous QBlit() to completely finish (signals2).
  49. ; Then launches passes 3 & 4 with QBlit().
  50. ; Return immediately after launching passes 3 & 4.
  51. ; ** your task can render the next frame while the converter is still going **
  52. ; Signals via signals1 (asynchronously) after completion of pass 3.
  53. ; Signals via signals2 from CleanUp() on completion of QBlit().
  54. ;
  55. ; Approx timing for A4000/030, (320x200x8):
  56. ;    CPU pass min 13ms, max 37ms, depending how different (then return)
  57. ;    Asynchronous blitter passes add 62ms
  58. ;    Max framerate (with changes every frame) is 62ms/frame = 16fps
  59. ;        occurs when fBUFFER rendering time <= 25ms (= 62ms-37ms)
  60. ;
  61. ; Approx timing for A1200+fast ram, (320x200x8):
  62. ;     CPU pass min 18ms, max 55ms
  63. ;
  64. ;
  65. ; see c2p8_demo.c for example usage
  66. ; -------------------------------------------------------------------
  67.  
  68.  
  69.         section chunks,code
  70.  
  71. _c2p8_init:
  72.         movem.l    d2-d3/a2-a4/a6,-(sp)
  73.  
  74.         lea    mybltnode(pc),a4
  75.  
  76.         move.l    a0,chunky-mybltnode(a4)
  77.         move.l    a1,chunky_cmp-mybltnode(a4)
  78.         move.l    a2,planes-mybltnode(a4)
  79.         move.l    d0,signals1-mybltnode(a4)
  80.         move.l    d1,signals2-mybltnode(a4)
  81.  
  82.         move.l    d2,pixels-mybltnode(a4)
  83.         lsr.l    #1,d2
  84.         move.l    d2,pixels2-mybltnode(a4)
  85.         lsr.l    #1,d2
  86.         move.l    d2,pixels4-mybltnode(a4)
  87.         lsr.l    #1,d2
  88.         move.l    d2,pixels8-mybltnode(a4)
  89.         lsr.l    #1,d2
  90.         move.l    d2,pixels16-mybltnode(a4)
  91.         move.l    d3,offset-mybltnode(a4)
  92.         move.l    d4,tmp_buff2-mybltnode(a4)
  93.         move.l    d5,tmp_buff3-mybltnode(a4)
  94.  
  95.  
  96.         move.l    a3,gfxbase-mybltnode(a4)
  97.  
  98.         move.l    4.w,a6
  99.         move.l    a6,sysbase-mybltnode(a4)
  100.  
  101.         move.l    ThisTask(a6),task-mybltnode(a4) ; save task ptr
  102.  
  103.         movem.l    (sp)+,d2-d3/a2-a4/a6
  104.         rts
  105.  
  106.  
  107.         cnop    0,4
  108.  
  109. _c2p8_go:    movem.l    d2-d7/a2-a6,-(sp)
  110.  
  111.         lea    mybltnode(pc),a2
  112.         move.l    a2,a0
  113.  
  114. ; wait for previous call to c2p4 to finish pass 3
  115.  
  116.         move.l    signals1-mybltnode(a0),d0
  117.         move.l    sysbase(pc),a6
  118.         jsr    _LVOWait(a6)              ; signals1 in d0
  119.  
  120.         move.l    a2,a0
  121.         move.l    chunky-mybltnode(a0),a2
  122.         move.l    chunky_cmp-mybltnode(a0),a3
  123.  
  124. ;-------------------------------------------------
  125. ;original chunky data
  126. ;0        a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0
  127. ;2        c7c6c5c4c3c2c1c0 d7d6d5d4d3d2d1d0
  128. ;4        e7e6e5e4e3e2e1e0 f7f6f5f4f3f2f1f0
  129. ;6        g7g6g5g4g3g2g1g0 h7h6h5h4h3h2h1h0
  130. ;8        i7i6i5i4i3i2i1i0 j7j6j5j4j3j2j1j0
  131. ;10        k7k6k5k4k3k2k1k0 l7l6l5l4l3l2l1l0
  132. ;12        m7m6m5m4m3m2m1m0 n7n6n5n4n3n2n1n0
  133. ;14        o7o6o5o4o3o2o1o0 p7p6p5p4p3p2p1p0
  134. ;16        q7q6q5q4q3q2q1q0 r7r6r5r4r3r2r1r0
  135. ;18        s7s6s5s4s3s2s1s0 t7t6t5t4t3t2t1t0
  136. ;20        u7u6u5u4u3u2u1u0 v7v6v5v4v3v2v1v0
  137. ;22        w7w6w5w4w3w2w1w0 x7x6x5x4x3x2x1x0
  138. ;24        y7y6y5y4y3y2y1y0 z7z6z5z4z3z2z1z0
  139. ;26        A7A6A5A4A3A2A1A0 B7B6B5B4B3B2B1B0
  140. ;28        C7C6C5C4C3C2C1C0 D7D6D5D4D3D2D1D0
  141. ;30        E7E6E5E4E3E2E1E0 F7F6F5F4F3F2F1F0
  142. ;-------------------------------------------------
  143.  
  144.         move.l    pixels16-mybltnode(a0),d6
  145.         lsr.l    #1,d6        ; loop count = pixels/32
  146.  
  147.         move.l    pixels4-mybltnode(a0),d0
  148.         move.l    tmp_buff2(pc),a0
  149.  
  150.         lea    (a0,d0.l),a1    ; a1 -> buff2+pixels/4
  151.         lea    (a1,d0.l),a4    ; a4 -> buff2+pixels/2
  152.         lea    (a4,d0.l),a5    ; a5 -> buff2+3*pixels/4
  153.  
  154.         move.l    #$0f0f0f0f,d7    ; constant
  155.         move.l    #$00ff00ff,a6    ; constant
  156.  
  157.         bra.b    end_pass1loop
  158.  
  159.         cnop    0,4        ; align to 32 bits 
  160.  
  161. ; main loop (starts here) processes 32 chunky pixels at a time
  162. ; compare next 32 pixels with compare page, looking for differences
  163.  
  164. initpass1loop:    cmpm.l    (a2)+,(a3)+
  165.         bne.w    fix1
  166.         cmpm.l    (a2)+,(a3)+
  167.         bne.w    fix2
  168.         cmpm.l    (a2)+,(a3)+
  169.         bne.w    fix3
  170.         cmpm.l    (a2)+,(a3)+
  171.         bne.b    fix4
  172.         cmpm.l    (a2)+,(a3)+
  173.         bne.b    fix5
  174.         cmpm.l    (a2)+,(a3)+
  175.         bne.b    fix6
  176.         cmpm.l    (a2)+,(a3)+
  177.         bne.b    fix7
  178.         cmpm.l    (a2)+,(a3)+
  179.         bne.b    fix8
  180.  
  181.         addq.l    #8,a0        ; skip 8 bytes in output
  182.         addq.l    #8,a1        ; skip 8 bytes in output
  183.         addq.l    #8,a4        ; skip 8 bytes in output
  184.         addq.l    #8,a5        ; skip 8 bytes in output
  185.  
  186. end_pass1loop:    dbra    d6,initpass1loop
  187.  
  188.         bra.w    done2
  189.  
  190.         cnop    0,4
  191.  
  192. ; This becomes the main loop after the first difference is found
  193.  
  194. pass1loop:    cmpm.l    (a2)+,(a3)+
  195.         bne.b    fix1
  196.         cmpm.l    (a2)+,(a3)+
  197.         bne.b    fix2
  198.         cmpm.l    (a2)+,(a3)+
  199.         bne.b    fix3
  200.         cmpm.l    (a2)+,(a3)+
  201.         bne.b    fix4
  202.         cmpm.l    (a2)+,(a3)+
  203.         bne.b    fix5
  204.         cmpm.l    (a2)+,(a3)+
  205.         bne.b    fix6
  206.         cmpm.l    (a2)+,(a3)+
  207.         bne.b    fix7
  208.         cmpm.l    (a2)+,(a3)+
  209.         bne.b    fix8
  210.  
  211.         addq.l    #8,a0        ; skip 8 bytes in output
  212.         addq.l    #8,a1        ; skip 8 bytes in output
  213.         addq.l    #8,a4        ; skip 8 bytes in output
  214.         addq.l    #8,a5        ; skip 8 bytes in output
  215.  
  216.         dbra    d6,pass1loop
  217.  
  218.         bra.w    done
  219.  
  220.         cnop 0,4
  221.  
  222. ; difference found, restore a2 and a3
  223.  
  224. fix8:        sub.w    #32,a2
  225.         sub.w    #32,a3
  226.         bra.b    go_c2p
  227.  
  228. fix7:        sub.w    #28,a2
  229.         sub.w    #28,a3
  230.         bra.b    go_c2p
  231.  
  232. fix6:        sub.w    #24,a2
  233.         sub.w    #24,a3
  234.         bra.b    go_c2p
  235.  
  236. fix5:        sub.w    #20,a2
  237.         sub.w    #20,a3
  238.         bra.b    go_c2p
  239.  
  240. fix4:        sub.w    #16,a2
  241.         sub.w    #16,a3
  242.         bra.b    go_c2p
  243.  
  244.         cnop    0,4
  245.  
  246. fix3:        subq.l    #4,a2
  247.         subq.l    #4,a3
  248. fix2:        subq.l    #4,a2
  249.         subq.l    #4,a3
  250. fix1:        subq.l    #4,a2
  251.         subq.l    #4,a3
  252.  
  253. ; convert 32 pixels (passes 1 and 2 combined)
  254.  
  255. go_c2p:        movem.l    (a2)+,d0-d3    ; AaBbCcDd EeFfGgHh IiJjKkLl MmNnOoPp
  256.  
  257.         movem.l    d0-d3,(a3)    ; update compare buffer
  258.         adda.w    #16,a3
  259.  
  260.         exg    d7,a6        ; d7=$00ff00ff
  261.  
  262.         move.l    d0,d4        ; AaBbCcDd
  263.         and.l    d7,d4        ; ..Bb..Dd
  264.         eor.l    d4,d0        ; Aa..Cc..
  265.         lsl.l    #8,d4        ; Bb..Dd..
  266.  
  267.         move.l    d2,d5        ; IiJjKkLl
  268.         and.l    d7,d5        ; ..Jj..Ll
  269.         eor.l    d5,d2        ; Ii..Kk..
  270.         lsr.l    #8,d2        ; ..Ii..Kk
  271.  
  272.         or.l    d2,d0        ; AaIiCcKk
  273.         or.l    d5,d4        ; BbJjDdLl
  274.  
  275.         move.l    d1,d2        ; EeFfGgHh
  276.         and.l    d7,d2        ; ..Ff..Hh
  277.         eor.l    d2,d1        ; Ee..Gg..
  278.         lsl.l    #8,d2        ; Ff..Hh..
  279.  
  280.         move.l    d3,d5        ; MmNnOoPp
  281.         and.l    d7,d5        ; ..Nn..Pp
  282.         eor.l    d5,d3        ; Mm..Oo..
  283.         lsr.l    #8,d3        ; ..Mm..Oo
  284.  
  285.         or.l    d3,d1        ; EeMmGgOo
  286.         or.l    d5,d2        ; FfNnHhPp
  287.  
  288.         exg    d7,a6        ; d7 = $0f0f0f0f
  289.  
  290.         move.l    d0,d3        ; AaIiCcKk
  291.         and.l    d7,d3        ; .a.i.c.k
  292.         eor.l    d3,d0        ; A.I.C.K.
  293.         lsl.l    #4,d3        ; a.i.c.k.
  294.  
  295.         move.l    d1,d5        ; EeMmGgOo
  296.         and.l    d7,d5        ; .e.m.g.o
  297.  
  298.         or.l    d5,d3        ; aeimcgko
  299.         move.l    d3,(a4)+
  300.  
  301.         eor.l    d5,d1        ; E.M.G.O.
  302.         lsr.l    #4,d1        ; .E.M.G.O
  303.  
  304.         or.l    d1,d0        ; AEIMCGKO
  305.         move.l    d0,(a0)+
  306.  
  307.         move.l    d4,d1        ; BbJjDdLl
  308.         and.l    d7,d1        ; .b.j.d.l
  309.         eor.l    d1,d4        ; B.J.D.L.
  310.         lsl.l    #4,d1        ; b.j.d.l.
  311.  
  312.         move.l    d2,d5        ; FfNnHhPp
  313.         and.l    d7,d5        ; .f.n.h.p
  314.  
  315.         or.l    d5,d1        ; bfjndhlp
  316.         move.l    d1,(a5)+
  317.  
  318.         eor.l    d5,d2        ; F.N.H.P.
  319.         lsr.l    #4,d2        ; .F.N.H.P
  320.  
  321.         or.l    d2,d4        ; BFJNDHLP
  322.         move.l    d4,(a1)+
  323.  
  324.         bchg    #16,d6        ; repeat inner loop twice
  325.         beq.b    go_c2p
  326.  
  327.         dbra    d6,pass1loop
  328.  
  329. ; wait until previous QBlit() has completely finished (signals2)
  330. ; then start the blitter in the background for passes 3 & 4
  331.  
  332. done:        lea    mybltnode(pc),a2    ; a2->mybltnode
  333.         move.l    sysbase(pc),a6        ; a6->SysBase
  334.         move.l    signals2-mybltnode(a2),d0
  335.         jsr    _LVOWait(a6)
  336.  
  337.         move.l    a2,a1
  338.         move.l    gfxbase-mybltnode(a2),a6
  339.         jsr    _LVOQBlit(a6)
  340.  
  341.         bra.b    ret
  342.  
  343.  
  344. ; If we get to here then no difference was found.
  345. ; Signal the task (signals1) and return.
  346.  
  347.         cnop 0,4
  348.  
  349. done2:        lea    mybltnode(pc),a2
  350.         move.l    signals1-mybltnode(a2),d0
  351.         move.l    d0,d1
  352.         move.l    sysbase(pc),a6    ; a6->SysBase
  353.         jsr    _LVOSetSignal(a6)
  354.  
  355. ret:        movem.l    (sp)+,d2-d7/a2-a6
  356.         rts
  357.  
  358. ;-----------------------------------------------------------------------------
  359. ; QBlit functions (called asynchronously)
  360.  
  361. ;-------------------------------------------------
  362. ;buff2 after pass 2
  363. ;0        a7a6a5a4e7e6e5e4 i7i6i5i4m7m6m5m4
  364. ;2        c7c6c5c4g7g6g5g4 k7k6k5k4o7o6o5o4
  365. ;4        q7q6q5q4u7u6u5u4 y7y6y5y4C7C6C5C4
  366. ;6        s7s6s5s4w7w6w5w4 A7A6A5A4E7E6E5E4
  367. ;
  368. ;Pixels/4+0    b7b6b5b4f7f6f5f4 j7j6j5j4n7n6n5n4
  369. ;Pixels/4+2    d7d6d5d4h7h6h5h4 l7l6l5l4p7p6p5p4
  370. ;Pixels/4+4    r7r6r5r4v7v6v5v4 z7z6z5z4D7D6D5D4
  371. ;Pixels/4+6    t7t6t5t4x7x6x5x4 B7B6B5B4F7F6F5F4
  372. ;
  373. ;Pixels/2+0    a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0
  374. ;Pixels/2+2    c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0
  375. ;Pixels/2+4    q3q2q1q0u3u2u1u0 y3y2y1y0C3C2C1C0
  376. ;Pixels/2+6    s3s2s1s0w3w2w1w0 A3A2A1A0E3E2E1E0
  377. ;
  378. ;3*Pixels/4+0    b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0    
  379. ;3*Pixels/4+2    d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0
  380. ;3*Pixels/4+4    r3r2r1r0v3v2v1v0 z3z2z1z0D3D2D1D0
  381. ;3*Pixels/4+6    t3t2t1t0x3x2x1x0 B3B2B1B0F3F2F1F0
  382. ;-------------------------------------------------
  383.  
  384. ;Pass 3, subpass 1
  385. ;    apt        Buff2
  386. ;    bpt        Buff2+2
  387. ;    dpt        Buff3
  388. ;    amod        2
  389. ;    bmod        2
  390. ;    dmod        0
  391. ;    cdat        $cccc
  392. ;    sizv        Pixels/4
  393. ;    sizh        1 word
  394. ;    con        D=AC+(B>>2)~C, ascending
  395.  
  396.         cnop 0,4
  397.  
  398. blit31:        moveq    #-1,d0
  399.         move.l    d0,(bltafwm,a0)
  400.         move.w    #0,(bltdmod,a0)
  401.  
  402.         move.l    tmp_buff2(pc),d1
  403.         move.l    d1,bltapt(a0)
  404.  
  405.         addq.l    #2,d1                ; buff2+2
  406.         move.l    d1,bltbpt(a0)
  407.  
  408.  
  409.         move.l    tmp_buff3(pc),bltdpt(a0)
  410.         move.w    #2,bltamod(a0)            ; 2
  411.         move.w    #2,bltbmod(a0)            ; 2
  412.         move.w    pixels4+2-mybltnode(a1),bltsizv(a0)    ; pixels/4
  413.         move.w    #$cccc,bltcdat(a0)
  414.         move.l    #$0DE42000,bltcon0(a0)    ; D=AC+(B>>2)~C
  415.         move.w    #1,bltsizh(a0)        ;do blit
  416.         lea    blit32(pc),a0
  417.         move.l    a0,qblitfunc-mybltnode(a1)
  418.         rts
  419.  
  420. ;Pass 3, subpass 2
  421. ;    apt        Buff2+Pixels-2-2
  422. ;    bpt        Buff2+Pixels-2
  423. ;    dpt        Buff3+Pixels-2
  424. ;    amod        2
  425. ;    bmod        2
  426. ;    dmod        0
  427. ;    cdat        $cccc
  428. ;    sizv        Pixels/4
  429. ;    sizh        1 word
  430. ;    con        D=(A<<2)C+B~C, descending
  431.  
  432.         cnop 0,4
  433.  
  434. blit32:        move.l    tmp_buff2(pc),d0
  435.         add.l    pixels-mybltnode(a1),d0
  436.         subq.l    #2+2,d0
  437.         move.l    d0,bltapt(a0)        ; buff2+pixels-2-2
  438.         addq.l    #2,d0
  439.         move.l    d0,bltbpt(a0)        ; buff2+pixels-2
  440.  
  441.         sub.l    tmp_buff2(pc),d0
  442.         add.l    tmp_buff3(pc),d0
  443.  
  444.         move.l    d0,bltdpt(a0)        ; buff3+pixels-2
  445.         move.l    #$2DE40002,bltcon0(a0)    ; D=(A<<2)C+B~C, desc.
  446.         move.w    #1,bltsizh(a0)        ;do blit
  447.         lea    blit47(pc),a0
  448.         move.l    a0,qblitfunc-mybltnode(a1)
  449.         rts
  450.  
  451. ;-------------------------------------------------
  452. ;buff3 after pass 3
  453. ;0        a7a6c7c6e7e6g7g6 i7i6k7k6m7m6o7o6
  454. ;2        q7q6s7s6u7u6w7w6 y7y6A7A6C7C6E7E6
  455. ;
  456. ;Pixels/8+0    b7b6d7d6f7f6h7h6 j7j6l7l6n7n6p7p6
  457. ;Pixels/8+2    r7r6t7t6v7v6x7x6 z7z6B7B6D7D6F7F6
  458. ;
  459. ;Pixels/4+0    a3a2c3c2e3e2g3g2 i3i2k3k2m3m2o3o2
  460. ;Pixels/4+2    q3q2s3s2u3u2w3w2 y3y2A3A2C3C2E3E2
  461. ;
  462. ;3*Pixels/8+0    b3b2d3d2f3f2h3h2 j3j2l3l2n3n2p3p2
  463. ;3*Pixels/8+2    r3r2t3t2v3v2x3x2 z3z2B3B2D3D2F3F2
  464. ;
  465. ;Pixels/2+0    a5a4c5c4e5e4g5g4 i5i4k5k4m5m4o5o4
  466. ;Pixels/2+2    q5q4s5s4u5u4w5w4 y5y4A5A4C5C4E5E4
  467. ;
  468. ;5*Pixels/8+0    b5b4d5d4f5f4h5h4 j5j4l5l4n5n4p5p4
  469. ;5*Pixels/8+2    r5r4t5t4v5v4x5x4 z5z4B5B4D5D4F5F4
  470. ;
  471. ;3*Pixels/4+0    a1a0c1c0e1e0g1g0 i1i0k1k0m1m0o1o0
  472. ;3*Pixels/4+2    q1q0s1s0u1u0w1w0 y1y0A1A0C1C0E1E0
  473. ;
  474. ;7*Pixels/8+0    b1b0d1d0f1f0h1h0 j1j0l1l0n1n0p1p0
  475. ;7*Pixels/8+2    r1r0t1t0v1v0x1x0 z1z0B1B0D1D0F1F0
  476. ;-------------------------------------------------
  477.  
  478. ;Pass 4, plane 7
  479. ;    apt        Buff3+0*pixels/8
  480. ;    bpt        Buff3+1*pixels/8
  481. ;    dpt        Plane7+offset
  482. ;    amod        0
  483. ;    bmod        0
  484. ;    dmod        0
  485. ;    cdat        $aaaa
  486. ;    sizv        Pixels/16
  487. ;    sizh        1 word
  488. ;    con        D=AC+(B>>1)~C, ascending
  489.  
  490.         cnop 0,4
  491.  
  492. blit47:        movem.l    a2,-(sp)
  493.         move.l    tmp_buff3(pc),d0
  494.         move.l    d0,bltapt(a0)        ; buff3+0*pixels/8
  495.         add.l    pixels8-mybltnode(a1),d0
  496.         move.l    d0,(bltbpt,a0)        ; buff3+1*pixels/8
  497.         move.l    planes-mybltnode(a1),a2
  498.         move.l    (7*4,a2),d0
  499.         add.l    offset-mybltnode(a1),d0
  500.         move.l    d0,bltdpt(a0)        ; Plane7+offset
  501.         move.w    #0,bltamod(a0)
  502.         move.w    #0,bltbmod(a0)
  503.         move.w    pixels16+2-mybltnode(a1),bltsizv(a0)    ; pixels/16
  504.         move.w    #$aaaa,bltcdat(a0)
  505.         move.l    #$0DE41000,bltcon0(a0)    ; D=AC+(B>>1)~C
  506.         move.w    #1,bltsizh(a0)        ;plane 7
  507.  
  508.         movem.l    a1/a6,-(sp)
  509.         move.l    signals1-mybltnode(a1),d0
  510.         move.l    task-mybltnode(a1),a1
  511.         move.l    sysbase(pc),a6        ; a6->SysBase
  512.         jsr    _LVOSignal(a6)        ; signal pass 3 has finished
  513.         movem.l    (sp)+,a1/a6
  514.  
  515.         lea    blit43(pc),a0
  516.         move.l    a0,qblitfunc-mybltnode(a1)
  517.         movem.l    (sp)+,a2
  518.         rts
  519.  
  520. ;-------------------------------------------------
  521. ;Plane7        a7b7c7d7e7f7g7h7 i7j7k7l7m7n7o7p7
  522. ;Plane7+2    q7r7s7t7u7v7w7x7 y7z7A7B7C7D7E7F7
  523. ;-------------------------------------------------
  524.  
  525. ;Pass 4, plane 3
  526. ;    apt        buff3+2*pixels/8
  527. ;    bpt        buff3+3*pixels/8
  528. ;    dpt        Plane3+offset
  529. ;    amod        0
  530. ;    bmod        0
  531. ;    dmod        0
  532. ;    cdat        $aaaa
  533. ;    sizv        pixels/16
  534. ;    sizh        1 word
  535. ;    con        D=AC+(B>>1)~C, ascending
  536.  
  537.         cnop 0,4
  538.  
  539. blit43:        move.l    a2,d1            ; preserve a2
  540.         move.l    (tmp_buff3,pc),d0
  541.         add.l    pixels4-mybltnode(a1),d0
  542.         move.l    d0,(bltapt,a0)        ; buff3+2*pixels/8
  543.         add.l    pixels8-mybltnode(a1),d0
  544.         move.l    d0,(bltbpt,a0)        ; buff3+3*pixels/8
  545.         move.l    planes-mybltnode(a1),a2
  546.         move.l    (3*4,a2),d0
  547.         add.l    offset-mybltnode(a1),d0
  548.         move.l    d0,bltdpt(a0)        ; Plane3+offset
  549.         move.w    #1,bltsizh(a0)        ;plane 3
  550.         lea    blit45(pc),a0
  551.         move.l    a0,qblitfunc-mybltnode(a1)
  552.         move.l    d1,a2            ; restore a2
  553.         rts
  554.  
  555. ;-------------------------------------------------
  556. ;Plane3        a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3
  557. ;Plane3+2    q3r3s3t3u3v3w3x3 y3z3A3B3C3D3E3F3
  558. ;-------------------------------------------------
  559.  
  560. ;Pass 4, plane 5
  561. ;    apt        buff3+4*pixels/8
  562. ;    bpt        buff3+5*pixels/8
  563. ;    dpt        Plane5+offset
  564. ;    amod        0
  565. ;    bmod        0
  566. ;    dmod        0
  567. ;    cdat        $aaaa
  568. ;    sizv        pixels/16
  569. ;    sizh        1 word
  570. ;    con        D=AC+(B>>1)~C, ascending
  571.  
  572.         cnop 0,4
  573.  
  574. blit45:        move.l    a2,d1            ; preserve a2
  575.         move.l    tmp_buff3(pc),d0
  576.         add.l    pixels2-mybltnode(a1),d0
  577.         move.l    d0,(bltapt,a0)        ; buff3+4*pixels/8
  578.         add.l    pixels8-mybltnode(a1),d0
  579.         move.l    d0,(bltbpt,a0)        ; buff3+5*pixels/8
  580.         move.l    planes-mybltnode(a1),a2
  581.         move.l    (5*4,a2),d0
  582.         add.l    offset-mybltnode(a1),d0
  583.         move.l    d0,bltdpt(a0)        ; Plane5+offset
  584.         move.w    #1,bltsizh(a0)        ;plane 5
  585.         lea    blit41(pc),a0
  586.         move.l    a0,qblitfunc-mybltnode(a1)
  587.         move.l    d1,a2            ; restore a2
  588.         rts
  589.  
  590. ;-------------------------------------------------
  591. ;Plane5        a5b5c5d5e5f5g5h5 i5j5k5l5m5n5o5p5
  592. ;Plane5+2    q5r5s5t5u5v5w5x5 y5z5A5B5C5D5E5F5
  593. ;-------------------------------------------------
  594.  
  595. ;Pass 4, plane 1
  596. ;    apt        buff3+6*pixels/8
  597. ;    bpt        buff3+7*pixels/8
  598. ;    dpt        Plane1+offset
  599. ;    amod        0
  600. ;    bmod        0
  601. ;    dmod        0
  602. ;    cdat        $aaaa
  603. ;    sizv        pixels/16
  604. ;    sizh        1 word
  605. ;    con        D=AC+(B>>1)~C, ascending
  606.  
  607.         cnop 0,4
  608.  
  609. blit41:        move.l    a2,d1            ; preserve a2
  610.         move.l    tmp_buff3(pc),d0
  611.         add.l    pixels4-mybltnode(a1),d0
  612.         add.l    pixels2-mybltnode(a1),d0
  613.         move.l    d0,bltapt(a0)        ; buff3+6*pixels/8
  614.         add.l    pixels8-mybltnode(a1),d0
  615.         move.l    d0,bltbpt(a0)        ; buff3+7*pixels/8
  616.         move.l    planes-mybltnode(a1),a2
  617.         move.l    (1*4,a2),d0
  618.         add.l    offset-mybltnode(a1),d0
  619.         move.l    d0,bltdpt(a0)        ; Plane1+offset
  620.         move.w    #1,bltsizh(a0)        ;plane 1
  621.         lea    blit46(pc),a0
  622.         move.l    a0,qblitfunc-mybltnode(a1)
  623.         move.l    d1,a2            ; restore a2
  624.         rts
  625.  
  626. ;-------------------------------------------------
  627. ;Plane1        a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1
  628. ;Plane1+2    q1r1s1t1u1v1w1x1 y1z1A1B1C1D1E1F1
  629. ;-------------------------------------------------
  630.  
  631. ;Pass 4, plane 6
  632. ;    apt        buff3+1*pixels/8-2
  633. ;    bpt        buff3+2*pixels/8-2
  634. ;    dpt        Plane6+plsiz-2+offset
  635. ;    amod        0
  636. ;    bmod        0
  637. ;    dmod        0
  638. ;    cdat        $aaaa
  639. ;    sizv        pixels/16
  640. ;    sizh        1 word
  641. ;    con        D=(A<<1)C+B~C, descending
  642.  
  643.         cnop 0,4
  644.  
  645. blit46:        move.l    a2,d1            ; preserve a2
  646.         move.l    tmp_buff3(pc),d0
  647.         add.l    pixels8-mybltnode(a1),d0
  648.         subq.l    #2,d0
  649.         move.l    d0,bltapt(a0)        ; buff3+1*pixels/8-2
  650.         add.l    pixels8-mybltnode(a1),d0
  651.         move.l    d0,bltbpt(a0)        ; buff3+2*pixels/8-2
  652.         move.l    planes-mybltnode(a1),a2
  653.         move.l    (6*4,a2),d0
  654.         add.l    offset-mybltnode(a1),d0
  655.         add.l    pixels8-mybltnode(a1),d0
  656.         subq.l    #2,d0
  657.         move.l    d0,bltdpt(a0)        ; Plane6+offset+plsiz-2
  658.         move.l    #$1DE40002,bltcon0(a0)    ; D=(A<<1)C+B~C, desc.
  659.         move.w    #1,bltsizh(a0)        ;plane 6
  660.         lea    blit42(pc),a0
  661.         move.l    a0,qblitfunc-mybltnode(a1)
  662.         move.l    d1,a2            ; restore a2
  663.         rts
  664.  
  665. ;-------------------------------------------------
  666. ;Plane6        a6b6c6d6e6f6g6h6 i6j6k6l6m6n6o6p6
  667. ;Plane6+2    q6r6s6t6u6v6w6x6 y6z6A6B6C6D6E6F6
  668. ;-------------------------------------------------
  669.  
  670. ;Pass 4, plane 2
  671. ;    apt        buff3+3*pixels/8-2
  672. ;    bpt        buff3+4*pixels/8-2
  673. ;    dpt        Plane2+plsiz-2+offset
  674. ;    amod        0
  675. ;    bmod        0
  676. ;    dmod        0
  677. ;    cdat        $aaaa
  678. ;    sizv        pixels/16
  679. ;    sizh        1 word
  680. ;    con        D=(A<<1)C+B~C, descending
  681.  
  682.         cnop 0,4
  683.  
  684. blit42:        move.l    a2,d1            ; preserve a2
  685.         move.l    tmp_buff3(pc),d0
  686.         add.l    pixels2-mybltnode(a1),d0
  687.         subq.l    #2,d0
  688.         move.l    d0,bltbpt(a0)        ; buff3+4*pixels/8-2
  689.         sub.l    pixels8-mybltnode(a1),d0
  690.         move.l    d0,(bltapt,a0)        ; buff3+3*pixels/8-2
  691.         move.l    planes-mybltnode(a1),a2
  692.         move.l    (2*4,a2),d0
  693.         add.l    offset-mybltnode(a1),d0
  694.         add.l    pixels8-mybltnode(a1),d0
  695.         subq.l    #2,d0
  696.         move.l    d0,bltdpt(a0)        ; Plane2+offset+plsiz-2
  697.         move.w    #1,bltsizh(a0)        ;plane 2
  698.         lea    (blit44,pc),a0
  699.         move.l    a0,qblitfunc-mybltnode(a1)
  700.         move.l    d1,a2            ; restore a2
  701.         rts
  702.  
  703. ;-------------------------------------------------
  704. ;Plane2        a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2
  705. ;Plane2+2    q2r2s2t2u2v2w2x2 y2z2A2B2C2D2E2F2
  706. ;-------------------------------------------------
  707.  
  708. ;Pass 4, plane 4
  709. ;    apt        buff3+5*pixels/8-2
  710. ;    bpt        buff3+6*pixels/8-2
  711. ;    dpt        Plane4+plsiz-2+offset
  712. ;    amod        0
  713. ;    bmod        0
  714. ;    dmod        0
  715. ;    cdat        $aaaa
  716. ;    sizv        pixels/16
  717. ;    sizh        1 word
  718. ;    con        D=(A<<1)C+B~C, descending
  719.  
  720.         cnop 0,4
  721.  
  722. blit44:        move.l    a2,d1            ; preserve a2
  723.         move.l    tmp_buff3(pc),d0
  724.         add.l    pixels2-mybltnode(a1),d0
  725.         add.l    pixels4-mybltnode(a1),d0
  726.         subq.l    #2,d0
  727.         move.l    d0,bltbpt(a0)        ; buff3+6*pixels/8-2
  728.         sub.l    pixels8-mybltnode(a1),d0
  729.         move.l    d0,bltapt(a0)        ; buff3+5*pixels/8-2
  730.         move.l    planes-mybltnode(a1),a2
  731.         move.l    (4*4,a2),d0
  732.         add.l    offset-mybltnode(a1),d0
  733.         add.l    pixels8-mybltnode(a1),d0
  734.         subq.l    #2,d0
  735.         move.l    d0,bltdpt(a0)        ; Plane4+offset+plsiz-2
  736.         move.w    #1,bltsizh(a0)        ;plane 4
  737.         lea    blit40(pc),a0
  738.         move.l    a0,qblitfunc-mybltnode(a1)
  739.         move.l    d1,a2            ; restore a2
  740.         rts
  741.  
  742. ;-------------------------------------------------
  743. ;Plane4        a4b4c4d4e4f4g4h4 i4j4k4l4m4n4o4p4
  744. ;Plane4+2    q4r4s4t4u4v4w4x4 y4z4A4B4C4D4E4F4
  745. ;-------------------------------------------------
  746.  
  747. ;Pass 4, plane 0
  748. ;    apt        buff3+7*pixels/8-2
  749. ;    bpt        buff3+8*pixels/8-2
  750. ;    dpt        Plane0+plsiz-2+offset
  751. ;    amod        0
  752. ;    bmod        0
  753. ;    dmod        0
  754. ;    cdat        $aaaa
  755. ;    sizv        pixels/16
  756. ;    sizh        1 word
  757. ;    con        D=(A<<1)C+B~C, descending
  758.  
  759.         cnop 0,4
  760.  
  761. blit40:        move.l    a2,d1            ; preserve a2
  762.         move.l    tmp_buff3(pc),d0
  763.         add.l    pixels-mybltnode(a1),d0
  764.         subq.l    #2,d0
  765.         move.l    d0,bltbpt(a0)        ; buff3+8*pixels/8-2
  766.         sub.l    pixels8-mybltnode(a1),d0
  767.         move.l    d0,(bltapt,a0)        ; buff3+7*pixels/8-2
  768.         move.l    planes-mybltnode(a1),a2
  769.         move.l    (a2),d0
  770.         add.l    offset-mybltnode(a1),d0
  771.         add.l    pixels8-mybltnode(a1),d0
  772.         subq.l    #2,d0
  773.         move.l    d0,bltdpt(a0)        ; Plane0+offset+plsiz-2
  774.         move.w    #1,bltsizh(a0)        ;plane 0
  775.         lea    blit31(pc),a0
  776.         move.l    a0,qblitfunc-mybltnode(a1)
  777.         move.l    d1,a2            ; restore a2
  778.         moveq    #0,d0            ; set Z flag
  779.         rts
  780.  
  781. ;-------------------------------------------------
  782. ;Plane0        a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0
  783. ;Plane0+2    q0r0s0t0u0v0w0x0 y0z0A0B0C0D0E0F0
  784. ;-------------------------------------------------
  785.  
  786.         cnop 0,4
  787.  
  788. qblitcleanup:    movem.l    a2/a6,-(sp)
  789.         lea    mybltnode(pc),a2
  790.         move.l    task-mybltnode(a2),a1    ; signal QBlit() has finished
  791.         move.l    signals2-mybltnode(a2),d0
  792.         move.l    sysbase(pc),a6
  793.         jsr    _LVOSignal(a6)        ; may be called from interrupts
  794.         movem.l    (sp)+,a2/a6
  795.         rts
  796.  
  797.  
  798. ; ----------------------------- data --------------------------------------
  799. ; not in a seperate section since some variables can be referred via (pc)
  800.  
  801.         cnop 0,4        ; align to 32 bits
  802.  
  803. cleanup        equ    $40
  804.  
  805. mybltnode:    dc.l    0        ; next bltnode
  806. qblitfunc:    dc.l    blit31        ; ptr to qblitfunc()
  807.         dc.b    cleanup        ; stat
  808.         dc.b    0        ; filler
  809.         dc.w    0        ; blitsize
  810.         dc.w    0        ; beamsync
  811.         dc.l    qblitcleanup    ; ptr to qblitcleanup()
  812.  
  813.         cnop 0,4
  814.  
  815. chunky:        dc.l    0        ; ptr to original chunky data
  816. chunky_cmp:    dc.l    0        ; ptr to chunky data compare buffer
  817. planes:        dc.l    0        ; ptr to list of output plane ptrs
  818. pixels:        dc.l    0        ; width*height
  819. pixels2:    dc.l    0        ; width*height/2
  820. pixels4:    dc.l    0        ; width*height/4
  821. pixels8:    dc.l    0        ; width*height/8
  822. pixels16:    dc.l    0        ; width*height/16
  823. offset:        dc.l    0        ; byte offset into plane
  824. tmp_buff2:    dc.l    0        ; pointer to chip buffer
  825. tmp_buff3:    dc.l    0        ; pointer to chip buffer
  826. task:        dc.l    0        ; ptr to this task
  827. signals1:    dc.l    0        ; signals to Signal() after pass 3
  828. signals2:    dc.l    0        ; signals to Signal() at cleanup
  829. gfxbase:    dc.l    0        ; GfxBase
  830. sysbase:    dc.l    0        ; ExecBase
  831.  
  832.         end
  833.  
  834.